package model

import (
	"fmt"
	"gorm.io/gorm"
	"time"
)

type _WkbGroupMemberMgr struct {
	*_BaseMgr
}

// WkbGroupMemberMgr open func
func WkbGroupMemberMgr(db *gorm.DB) *_WkbGroupMemberMgr {
	if db == nil {
		panic(fmt.Errorf("WkbGroupMemberMgr need init by db"))
	}
	ctx, cancel := context.WithCancel(context.Background())
	return &_WkbGroupMemberMgr{_BaseMgr: &_BaseMgr{DB: db.Table("wkb_im_group_member"), isRelated: globalIsRelated, ctx: ctx, cancel: cancel, timeout: -1}}
}

// GetTableName get sql table name.获取数据库名字
func (obj *_WkbGroupMemberMgr) GetTableName() string {
	return "wkb_im_group_member"
}

// Get 获取
func (obj *_WkbGroupMemberMgr) Get() (result WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Find(&result).Error
	if err == nil && obj.isRelated {
		if err = obj.New().Table("wkb_im_group").Where("group_id = ?", result.GroupID).Find(&result.WkbGroup).Error; err != nil { // 群聊
			if err != gorm.ErrRecordNotFound { // 非 没找到
				return
			}
		}
	}

	return
}

// Gets 获取批量结果
func (obj *_WkbGroupMemberMgr) Gets() (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

//////////////////////////option case ////////////////////////////////////////////

// WithID id获取 id
func (obj *_WkbGroupMemberMgr) WithID(id uint32) Option {
	return optionFunc(func(o *options) { o.query["id"] = id })
}

// WithGroupID group_id获取 用户雪花ID，采用雪花算法
func (obj *_WkbGroupMemberMgr) WithGroupID(groupID string) Option {
	return optionFunc(func(o *options) { o.query["group_id"] = groupID })
}

// WithMemberName member_name获取 群成员昵称
func (obj *_WkbGroupMemberMgr) WithMemberName(memberName string) Option {
	return optionFunc(func(o *options) { o.query["member_name"] = memberName })
}

// WithMemberType member_type获取 成员类型,0用户,1机器人,2管理员,3客服,4FAE
func (obj *_WkbGroupMemberMgr) WithMemberType(memberType int8) Option {
	return optionFunc(func(o *options) { o.query["member_type"] = memberType })
}

// WithAvatar avatar获取 头像
func (obj *_WkbGroupMemberMgr) WithAvatar(avatar string) Option {
	return optionFunc(func(o *options) { o.query["avatar"] = avatar })
}

// WithUpdatedAt updated_at获取 更新时间
func (obj *_WkbGroupMemberMgr) WithUpdatedAt(updatedAt time.Time) Option {
	return optionFunc(func(o *options) { o.query["updated_at"] = updatedAt })
}

// WithCreatedAt created_at获取 创建时间
func (obj *_WkbGroupMemberMgr) WithCreatedAt(createdAt time.Time) Option {
	return optionFunc(func(o *options) { o.query["created_at"] = createdAt })
}

// WithUserID user_id获取 用户id
func (obj *_WkbGroupMemberMgr) WithUserID(userID int) Option {
	return optionFunc(func(o *options) { o.query["user_id"] = userID })
}

// WithUserName user_name获取 用户名
func (obj *_WkbGroupMemberMgr) WithUserName(userName string) Option {
	return optionFunc(func(o *options) { o.query["user_name"] = userName })
}

// GetByOption 功能选项模式获取
func (obj *_WkbGroupMemberMgr) GetByOption(opts ...Option) (result WkbGroupMember, err error) {
	options := options{
		query: make(map[string]interface{}, len(opts)),
	}
	for _, o := range opts {
		o.apply(&options)
	}

	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where(options.query).Find(&result).Error
	if err == nil && obj.isRelated {
		if err = obj.New().Table("wkb_im_group").Where("group_id = ?", result.GroupID).Find(&result.WkbGroup).Error; err != nil { // 群聊
			if err != gorm.ErrRecordNotFound { // 非 没找到
				return
			}
		}
	}

	return
}

// GetByOptions 批量功能选项模式获取
func (obj *_WkbGroupMemberMgr) GetByOptions(opts ...Option) (results []*WkbGroupMember, err error) {
	options := options{
		query: make(map[string]interface{}, len(opts)),
	}
	for _, o := range opts {
		o.apply(&options)
	}

	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where(options.query).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

//////////////////////////enume case ////////////////////////////////////////////

// GetFromID 通过id获取内容 id
func (obj *_WkbGroupMemberMgr) GetFromID(id uint32) (result WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("id = ?", id).Find(&result).Error
	if err == nil && obj.isRelated {
		if err = obj.New().Table("wkb_im_group").Where("group_id = ?", result.GroupID).Find(&result.WkbGroup).Error; err != nil { // 群聊
			if err != gorm.ErrRecordNotFound { // 非 没找到
				return
			}
		}
	}

	return
}

// GetBatchFromID 批量唯一主键查找 id
func (obj *_WkbGroupMemberMgr) GetBatchFromID(ids []uint32) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("id IN (?)", ids).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetFromGroupID 通过group_id获取内容 用户雪花ID，采用雪花算法
func (obj *_WkbGroupMemberMgr) GetFromGroupID(groupID string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("group_id = ?", groupID).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetBatchFromGroupID 批量唯一主键查找 用户雪花ID，采用雪花算法
func (obj *_WkbGroupMemberMgr) GetBatchFromGroupID(groupIDs []string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("group_id IN (?)", groupIDs).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetFromMemberName 通过member_name获取内容 群成员昵称
func (obj *_WkbGroupMemberMgr) GetFromMemberName(memberName string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("member_name = ?", memberName).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetBatchFromMemberName 批量唯一主键查找 群成员昵称
func (obj *_WkbGroupMemberMgr) GetBatchFromMemberName(memberNames []string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("member_name IN (?)", memberNames).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetFromMemberType 通过member_type获取内容 成员类型,0用户,1机器人,2管理员,3客服,4FAE
func (obj *_WkbGroupMemberMgr) GetFromMemberType(memberType int8) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("member_type = ?", memberType).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetBatchFromMemberType 批量唯一主键查找 成员类型,0用户,1机器人,2管理员,3客服,4FAE
func (obj *_WkbGroupMemberMgr) GetBatchFromMemberType(memberTypes []int8) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("member_type IN (?)", memberTypes).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetFromAvatar 通过avatar获取内容 头像
func (obj *_WkbGroupMemberMgr) GetFromAvatar(avatar string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("avatar = ?", avatar).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetBatchFromAvatar 批量唯一主键查找 头像
func (obj *_WkbGroupMemberMgr) GetBatchFromAvatar(avatars []string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("avatar IN (?)", avatars).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetFromUpdatedAt 通过updated_at获取内容 更新时间
func (obj *_WkbGroupMemberMgr) GetFromUpdatedAt(updatedAt time.Time) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("updated_at = ?", updatedAt).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetBatchFromUpdatedAt 批量唯一主键查找 更新时间
func (obj *_WkbGroupMemberMgr) GetBatchFromUpdatedAt(updatedAts []time.Time) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("updated_at IN (?)", updatedAts).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetFromCreatedAt 通过created_at获取内容 创建时间
func (obj *_WkbGroupMemberMgr) GetFromCreatedAt(createdAt time.Time) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("created_at = ?", createdAt).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetBatchFromCreatedAt 批量唯一主键查找 创建时间
func (obj *_WkbGroupMemberMgr) GetBatchFromCreatedAt(createdAts []time.Time) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("created_at IN (?)", createdAts).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetFromUserID 通过user_id获取内容 用户id
func (obj *_WkbGroupMemberMgr) GetFromUserID(userID int) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("user_id = ?", userID).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetBatchFromUserID 批量唯一主键查找 用户id
func (obj *_WkbGroupMemberMgr) GetBatchFromUserID(userIDs []int) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("user_id IN (?)", userIDs).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetFromUserName 通过user_name获取内容 用户名
func (obj *_WkbGroupMemberMgr) GetFromUserName(userName string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("user_name = ?", userName).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

// GetBatchFromUserName 批量唯一主键查找 用户名
func (obj *_WkbGroupMemberMgr) GetBatchFromUserName(userNames []string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("user_name IN (?)", userNames).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}

//////////////////////////primary index case ////////////////////////////////////////////

// FetchByPrimaryKey primay or index 获取唯一内容
func (obj *_WkbGroupMemberMgr) FetchByPrimaryKey(id uint32) (result WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("id = ?", id).Find(&result).Error
	if err == nil && obj.isRelated {
		if err = obj.New().Table("wkb_im_group").Where("group_id = ?", result.GroupID).Find(&result.WkbGroup).Error; err != nil { // 群聊
			if err != gorm.ErrRecordNotFound { // 非 没找到
				return
			}
		}
	}

	return
}

// FetchIndexByGroupID  获取多个内容
func (obj *_WkbGroupMemberMgr) FetchIndexByGroupID(groupID string) (results []*WkbGroupMember, err error) {
	err = obj.DB.WithContext(obj.ctx).Table(obj.GetTableName()).Where("group_id = ?", groupID).Find(&results).Error
	if err == nil && obj.isRelated {
		for i := 0; i < len(results); i++ {
			if err = obj.New().Table("wkb_im_group").Where("group_id = ?", results[i].GroupID).Find(&results[i].WkbGroup).Error; err != nil { // 群聊
				if err != gorm.ErrRecordNotFound { // 非 没找到
					return
				}
			}
		}
	}
	return
}
